//
// Created by madison on 2022/1/10.
//

#include <iostream>

using namespace std;

class Box {
public:
    double length;   // 长度
    double breadth;  // 宽度
    double height;   // 高度
    // 成员函数声明
    double get(void);

    double getVolume(void);

    void setLength(double len);

    void setBreadth(double bre);

    void setHeight(double hei);

    void set(double len, double bre, double hei);
};

double Box::get(void) {
    return length * breadth * height;
}

void Box::set(double len, double bre, double hei) {
    length = len;
    breadth = bre;
    height = hei;
}

// 成员函数定义
double Box::getVolume(void) {
    return length * breadth * height;
}

void Box::setLength(double len) {
    length = len;
}

void Box::setBreadth(double bre) {
    breadth = bre;
}

void Box::setHeight(double hei) {
    height = hei;
}


int main() {
    Box Box1;        // 声明 Box1，类型为 Box
    Box Box2;        // 声明 Box2，类型为 Box
    Box Box3;        // 声明 Box3，类型为 Box
    double volume = 0.0;     // 用于存储体积

    // box 1 详述
    Box1.height = 5.0;
    Box1.length = 6.0;
    Box1.breadth = 7.0;

    // box 2 详述
    Box2.height = 10.0;
    Box2.length = 12.0;
    Box2.breadth = 13.0;

    // box 1 的体积
    volume = Box1.height * Box1.length * Box1.breadth;
    cout << "Box1 的体积：" << volume << endl;

    // box 2 的体积
    volume = Box2.height * Box2.length * Box2.breadth;
    cout << "Box2 的体积：" << volume << endl;


    // box 3 详述
    Box3.set(16.0, 8.0, 12.0);
    volume = Box3.get();
    cout << "Box3 的体积：" << volume << endl;

    // 类成员函数
    void fun1();
    fun1();

    // 类访问修饰符
    void fun2();
    fun2();

    void fun3();
    fun3();
    return 0;
}


void fun1() {
    Box Box1;                // 声明 Box1，类型为 Box
    Box Box2;                // 声明 Box2，类型为 Box
    double volume = 0.0;     // 用于存储体积

    // box 1 详述
    Box1.setLength(6.0);
    Box1.setBreadth(7.0);
    Box1.setHeight(5.0);

    // box 2 详述
    Box2.setLength(12.0);
    Box2.setBreadth(13.0);
    Box2.setHeight(10.0);

    // box 1 的体积
    volume = Box1.getVolume();
    cout << "Box1 的体积：" << volume << endl;

    // box 2 的体积
    volume = Box2.getVolume();
    cout << "Box2 的体积：" << volume << endl;
}

// 公有（public）成员
class Line {
public:
    double length;

    void setLength(double len);

    double getLength(void);
};

// 成员函数定义
double Line::getLength(void) {
    return length;
}

void Line::setLength(double len) {
    length = len;
}

void fun2() {
    Line line;
    line.setLength(6.0);
    cout << "Length of line : " << line.getLength() << endl;

    // 不使用成员函数设置长度
    line.length = 10.0; // OK: 因为 length 是公有的
    cout << "Length of line : " << line.length << endl;
}

// 私有（private）成员
class BoxPrivate {
public:
    double length;

    void setWidth(double wid);

    double getWidth(void);

private:
    double width;
};

// 成员函数定义
double BoxPrivate::getWidth(void) {
    return width;
}

void BoxPrivate::setWidth(double wid) {
    width = wid;
}

void fun3() {
    BoxPrivate box;

    // 不使用成员函数设置长度
    box.length = 10.0; // OK: 因为 length 是公有的
    cout << "Length of box : " << box.length << endl;

    // 不使用成员函数设置宽度
    // box.width = 10.0; // Error: 因为 width 是私有的
    box.setWidth(10.0);  // 使用成员函数设置宽度
    cout << "Width of box : " << box.getWidth() << endl;
}

// protected（受保护）成员
class BoxProtected {
protected:
    double width;
};

class SmallBox : BoxProtected { // SmallBox 是派生类
public:
    void setSmallWidth(double wid);

    double getSmallWidth(void);
};

// 子类的成员函数
double SmallBox::getSmallWidth(void) {
    return width;
}

void SmallBox::setSmallWidth(double wid) {
    width = wid;
}

void fun4() {
    SmallBox box;
    // 使用成员函数设置宽度
    box.setSmallWidth(5.0);
    cout << "Width of box : " << box.getSmallWidth() << endl;
}